home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / TARFILE.GZ / tarfile / ch_3.5 / bcd / edge / edge_maps.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-09-11  |  3.6 KB  |  170 lines

  1. /*
  2.  * (c) Copyright 1988 by
  3.  * Robotics Principles Research Department, ATT Bell Laboratories.
  4.  * All rights reserved.
  5.  * Last modified 2/8/88 Ingemar J. Cox
  6.  * C version 8/2/88 Deborah A. Wallach
  7.  * C version 11/2/88 W. J. Kropfl
  8.  */
  9. #include <stdio.h>
  10. #include <math.h>
  11. #include "edge_finder.h"
  12.  
  13. extern struct image *my_image;
  14. extern int nxXny;        /*???*/
  15.  
  16. #define _nx my_image->nx
  17. #define image_zc_x(ix,iy,i) \
  18. (((image_locx(iy,ix,i)>0) != (image_locx(iy,ix+1,i+1)>0)) ?EDGE_X:0)
  19.  
  20. #define image_zc_y(ix,iy,i) \
  21. (((image_locy(iy+1,ix,i+_nx)>0) != (image_locy(iy,ix,i)>0)) ?EDGE_Y:0)
  22.  
  23. #define image_zc_135(ix,iy,i) \
  24. (((image_loc135(iy+1,ix+1,i+_nx+1)>0) != (image_loc135(iy,ix,i)>0)) ?EDGE_135:0)
  25.  
  26. #define image_zc_45(ix,iy,i) \
  27. (((image_loc45(iy+1,ix-1,i+_nx-1)>0) != (image_loc45(iy,ix,i)>0)) ?EDGE_45:0)
  28.  
  29. unsigned char* image_edges(threshold)
  30.      int threshold;
  31. {
  32.     unsigned char *map;
  33.     register int ix, iy, nx, orient_flag, index, ny;
  34.  
  35.     register int *px = my_image->idx;
  36.     register int *py = my_image->idy;
  37.     register int *p45  = my_image->id45;
  38.     register int *p135 = my_image->id135;
  39.     register unsigned char *mapp;
  40.  
  41.     nx = my_image->nx;
  42.     ny = my_image->ny;
  43.     nxXny = nx*ny;
  44.  
  45.     if((map = (unsigned char *)malloc(ny*nx*sizeof(unsigned char)))==0)
  46.     {
  47.         fprintf(stderr, "error: cannot allocate map array\n");
  48.         exit(1);
  49.     }
  50.     mapp = map;    
  51.  
  52.     for(iy=0; iy<ny; iy++)
  53.     {
  54.         for(ix=0; ix<nx; ix++)
  55.         {
  56.             register int sx, sy, s45, s135;
  57.             register int big;
  58.             sx = abs(*px);  px++;
  59.             sy = abs(*py);     py++;
  60.             s45 = (int)((float)(abs(*p45))/diag_scale); p45++;
  61.             s135 = (int)((float)(abs(*p135))/diag_scale); p135++;
  62.  
  63.             big = sx;
  64.  
  65.             orient_flag = EDGE_X;
  66.  
  67.             if(sy>big)
  68.             {
  69.                 big=sy;
  70.                 orient_flag = EDGE_Y;
  71.             }
  72.             if(s45>big)
  73.             {
  74.                 big=s45;
  75.                 orient_flag = EDGE_45;
  76.             }
  77.             if(s135>big)
  78.             {
  79.                 big=s135;
  80.                 orient_flag = EDGE_135;
  81.             }
  82.  
  83.             my_image->orient_flag = orient_flag; 
  84.  
  85.             if(big > threshold)
  86.             {
  87.                 index = mapp - map;
  88.                 switch (orient_flag)
  89.                 {
  90.                    case EDGE_X:
  91.                     *mapp++ = image_zc_x(ix, iy, index);
  92.                     break;
  93.                    case EDGE_Y:
  94.                     *mapp++ = image_zc_y(ix, iy, index);
  95.                     break;
  96.                    case EDGE_45:
  97.                     *mapp++ = image_zc_45(ix, iy, index);
  98.                     break;
  99.                    case EDGE_135:
  100.                     *mapp++ = image_zc_135(ix, iy, index);
  101.                     break;
  102.                    default:
  103.                     fprintf(stderr, "error in case statements\n");
  104.                     exit(1);
  105.                     break;
  106.                 }
  107.             }
  108.             else
  109.             {
  110.                 *mapp++ = 0;
  111.             }
  112.             }
  113.     }
  114. #ifdef DEBUG
  115.     image_Write_char("hi_map", map);
  116. #endif
  117.     return(map);
  118. }
  119.  
  120. image_edge_map_lo(ix, iy, index)
  121. register int ix, iy, index;        /* index = iy*nx+ix; */
  122. {
  123.     register int big, sx, sy, s45, s135;
  124.  
  125.     sx = abs(my_image->idx[index]);
  126.     sy = abs(my_image->idy[index]);
  127.     s45  = (int)((float)(abs(my_image->id45[index]))/diag_scale);
  128.     s135 = (int)((float)(abs(my_image->id135[index]))/diag_scale);
  129.     big=sx;
  130.  
  131.     my_image->orient_flag = EDGE_X;
  132.     
  133.     if(sy>big)
  134.     {
  135.         big=sy;
  136.         my_image->orient_flag = EDGE_Y;
  137.     }
  138.     if(s45>big)
  139.     {
  140.         big=s45;
  141.         my_image->orient_flag = EDGE_45;
  142.     }
  143.     if(s135>big)
  144.     {
  145.         big=s135;
  146.         my_image->orient_flag = EDGE_135;
  147.     }
  148.  
  149.     if(big > my_image->lo_threshold)
  150.     {
  151.         switch (my_image->orient_flag)
  152.         {
  153.             case EDGE_X:
  154.                 return(image_zc_x(ix, iy, index));
  155.             case EDGE_Y:
  156.                 return(image_zc_y(ix, iy, index));
  157.             case EDGE_45:
  158.                 return(image_zc_45(ix, iy, index));
  159.             case EDGE_135:
  160.                 return(image_zc_135(ix, iy, index));
  161.             default:
  162.                 fprintf(stderr, "error in case statements\n");
  163.                 exit(1);
  164.                 break;
  165.         }
  166.     }
  167.     else
  168.         return(0);
  169. }
  170.